package com.datang.litejvm.cmd;


import com.datang.litejvm.constant.ConstantFieldRefInfo;
import com.datang.litejvm.constant.ConstantPool;
import com.datang.litejvm.engin.ExecutionResult;
import com.datang.litejvm.engin.Heap;
import com.datang.litejvm.engin.JavaObject;
import com.datang.litejvm.engin.StackFrame;

public class GetStaticFieldCmd extends TwoOperandCmd {
    public GetStaticFieldCmd(ConstantPool pool, String opCode) {
        super(pool, opCode);
    }

    @Override
    public String toString() {
        return super.toString();
    }

    /**
     * @author: 顶风少年
     * @Description:获取对象的静态字段值 无符号数 indexbyte1 和 indexbyte2 用于构建一个当前类（§2.6）的运
     * 行时常量池的索引值，构建方式为（indexbyte1 << 8）| indexbyte2，
     * 该索引所指向的运行时常量池项应当是一个字段（§5.1）的符号引用，它包
     * 含了字段的名称和描述符，以及包含该字段的类或接口的符号引用。这个字段
     * 的符号引用是已被解析过的（§5.4.3.2）。
     * 在字段被成功解析之后，如果字段所在的类或者接口没有被初始化过（§5.5），
     * 那指令执行时将会触发其初始化过程。
     * 参数所指定的类或接口的该字段的值将会被取出，并推入到操作数栈顶。
     * @date: 14:57 2022/6/17
     **/
    @Override
    public void execute(StackFrame frame, ExecutionResult result) {
        ConstantFieldRefInfo constantFieldRefInfo = (ConstantFieldRefInfo) this.getConstantInfo(this.getIndex());
        String className = constantFieldRefInfo.getClassName();
        String fieldName = constantFieldRefInfo.getFieldName();
        String fieldType = constantFieldRefInfo.getFieldType();
        if ("java/lang/System".equals(className) && "out".equals(fieldName) && "Ljava/io/PrintStream;".equals(fieldType)) {
            JavaObject javaObject = Heap.getInstance().newObject(className);
            frame.getOperandStack().push(javaObject);
        }
        //TODO 处理非System.out的情况
    }


}
